package rkdwogus7.basic;

import java.util.Scanner;

public class J09_Exception {

	public static void main(String[] args) throws Exception	 { 
		// 예외 처리 - 일종의 오류
		// 프로그램에서 발생할 수 있는 오류error의 종류
		// 1. compile-time error
		// 	   오타 등의 잘못된 코드 작성이 원인
		//	  개발자가 충분히 수습 가능
		// 2. runtime error
		// 	  프로그램 실행 시 발생하는 오류
		//   치명적이지는 않은 오류도 존재(+를 해야 하는데 엉뚱한 값이 들어가는 등
		//   의 논리적 오류) : 개발자 수습가능.
		//	  잘못된 동작(개발자 수습 가능)이나 특별한 상황(개발자 수습불가)이 원인
		//   데이터베이스오류나 메모리부족, 디스크 부족 등을 포함
		
		// 따라서, 예외처리는 프로그램 실행 중 발생하는 오류를 개발자가 처리하기 위하여
		// 코드로 작성하는 조치사항을 의미
		// 이것을 통해 오류로 인한 프로그램 실행중단을 막을 수 있음
		
		// 예외 : checked exception
		//       unchecked exception
		// 관심있는 사람은 인터넷으로 선행학습 해 볼 것
		
		
		
		// 상황1) 두 개의 정수를 입력받아 두 수를 나눈 결과를 출력하는 프로그램 작성
		// 예외처리를 하지 않았을 경우
		int num1, num2, result;
		Scanner sc = new Scanner(System.in);
		
/*		System.out.println("두 수는?");
		num1 = sc.nextInt();
		num2 = sc.nextInt();
		result = num1 / num2;
		System.out.println( "두 수를 나눈 결과는 " + result );
*/		
		// num2 에 0 이 입력되면
		// num1 을 0으로 나눌 수 없으므로 오류가 발생하고 프로그램 중단
		// 중단 시 이후의 줄은 출력되지 않음
/*		System.out.println("두 수는?");
		num1 = sc.nextInt();
		num2 = sc.nextInt();
		if ( num1 == 0 || num2 == 0 ) {
			System.out.println( "0은 입력할 수 없습니다." );
		}
		else {
		result = num1 / num2;
		System.out.println( "두 수를 나눈 결과는 " + result );
		}*/
		// 오류가 발생할 조건을 if문으로 막음
		// 오류 발생 조건이 많을 경우 다중 if문을 사용해야 하는데 그러면 코드가 복잡해짐
		
		/* 프로그램에 오류가 발생하면 프로그램이 중단된다. (0으로 나눈다던가 하는 경우)
		 이런 부분들을 해결하기 위해 예외처리라는 메커니즘을 이용하는 것이다.
		 ATM기 같은 경우에서 잘못 입력했을 경우 카드 뱉고 다시 처음으로 돌아가는 것
		 기업에 납품하는 프로그램들은 중단이 돼서는 안된다. */
		
		// 지금은 if 하나만으로 되지만 코드가 많아지면 복잡해 지겠지?
		// 이 코드에서도 만약 누가 문자를 입력한다면 또 오류 나겠지?
		// 예전 C언어 등에서는 이렇게 일일이 오류를 if나 switch등으로 잡아야 했어
		// 자바는 이런 예외처리가 막강해서 좋다.
		
		/* 자바에서의 예외처리 */
/*		System.out.println("두 수는?");
		try {
		num1 = sc.nextInt();
		num2 = sc.nextInt();
		result = num1 / num2;
		System.out.println( "두 수를 나눈 결과는 " + result );
		} catch (Exception ex) {
			System.out.println( "입력값은 숫자이고 0 이상입니다!!" );
		}
*/
		// try 블록 안에서 오류가 발견되면 무조건 catch로 나가게 된다.
		// 자바에서는 오류발생시 예외exception처리 매커니즘을 사용함
		// 오류가 발생할 가능성이 있는 코드를 try - catch 블럭으로 지정하고
		// catch 에서 오류에 대한 조치사항을 작성
		
		
		// 예외 던지기
		System.out.println("두 수는?");
		try {
			num1 = sc.nextInt();
			num2 = sc.nextInt();
		} catch (Exception ex) {
			throw new Exception( "입력이 잘못되었습니다!" );
			// 입력시 발생하는 예외를 각각의 catch 블럭에서 처리하지 않고
			// 한 곳에 모아서 처리하기 위해 throw라는 명령으로 예외를 다른곳으로 넘김
		}
		// 이 두 줄에서 발생할 수 있는 예외
		
		try {
			result = num1 / num2;
			System.out.println( "두 수를 나눈 결과는 " + result );
		} catch (Exception ex) {
			throw new Exception( " 잘못된 연산을 시도하였습니다. " );
		}
		
		
		
	}

	
}












